﻿//
// Lightbox Gallery Module for DotNetNuke
// Project Contributors - Will Strohl (http://www.WillStrohl.com), Armand Datema (http://www.schwingsoft.com)
//
//Copyright (c) 2009-2013, Will Strohl
//All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are 
//permitted provided that the following conditions are met:
//
//Redistributions of source code must retain the above copyright notice, this list of 
//conditions and the following disclaimer.
//
//Redistributions in binary form must reproduce the above copyright notice, this list 
//of conditions and the following disclaimer in the documentation and/or other 
//materials provided with the distribution.
//
//Neither the name of Will Strohl, Armand Datema, Lightbox Gallery, nor the names of its contributors may be 
//used to endorse or promote products derived from this software without specific prior 
//written permission.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
//EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
//OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
//SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
//TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
//BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
//CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 
//DAMAGE.
//

//INSTANT C# NOTE: Formerly VB project-level imports:

using System.Globalization;
using DotNetNuke.Common;
using DotNetNuke.Common.Utilities;
using System;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.SessionState;
using DotNetNuke.Services.Exceptions;

namespace WillStrohl.Modules.Lightbox
{

	public partial class OrderHandler : IHttpHandler, IRequiresSessionState
	{

#region  Private Members 

		private int p_ModuleId = Null.NullInteger;
		private string p_Order = Null.NullString;

#endregion

#region  Properties 

		private int ModuleId
		{
			get
			{
				return p_ModuleId;
			}
		}

		private string Order
		{
			get
			{
				if (p_Order.EndsWith(","))
				{
					p_Order = p_Order.Substring(0, p_Order.Length - 1);
				}
				return p_Order;
			}
		}

#endregion

		public void ProcessRequest(HttpContext context)
		{

			try
			{

				context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
				context.Response.ContentType = "text/plain";

				if (context.Request.QueryString["mid"] != null)
				{
					try
					{
						p_ModuleId = int.Parse(context.Request.QueryString["mid"].ToString(CultureInfo.InvariantCulture), System.Globalization.NumberStyles.Integer);
					}
					catch
					{
						HandleError(context, "The mid parameter was not in the correct format.");
					}
				}
				else
				{
					HandleError(context, "The mid parameter is missing.");
				}

				if (context.Request.QueryString["order"] != null)
				{
					p_Order = context.Request.QueryString["order"].ToString();
					if (!Regex.IsMatch(p_Order, "^[\\d,]+$"))
					{
						HandleError(context, "The order parameter was not in the correct format.");
					}
				}
				else
				{
					HandleError(context, "The order parameter is missing.");
				}

				SaveOrder();

				context.Response.Write("true");

			}
			catch (Exception ex)
			{
				Exceptions.LogException(ex);
				if (Globals.IsEditMode())
				{
					HandleError(context, string.Concat(ex.Message, Environment.NewLine, ex.StackTrace));
				}
			}

		}

		private void SaveOrder()
		{

			int[] arrId = GetIdArray();
			int intCount = 1;
			var ctlModule = new LightboxController();
			LightboxInfo album = null;

			foreach(int oId in arrId)
			{
				if (oId > 0)
				{
					album = ctlModule.GetLightbox(oId);
					album.DisplayOrder = intCount;
					ctlModule.UpdateLightbox(album);
				}

				intCount += 1;
			}

		}

		private int[] GetIdArray()
		{

			string[] arrStr = Order.Split(',');
			int[] arrInt = new int[arrStr.Length + 1];
			int intCount = 0;

			foreach(string oStr in arrStr)
			{
				arrInt[intCount] = int.Parse(oStr, System.Globalization.NumberStyles.Integer);
				intCount += 1;
			}

			return arrInt;

		}

		private void HandleError(HttpContext context, string ErrorText)
		{

			context.Response.Write(ErrorText);
			context.Response.End();

		}

#region  IHttpHandler Implementation 

		public bool IsReusable
		{
			get
			{
				return true;
			}
		}

#endregion

	}

}